package com.wetao.testrxjava.dagger;

import javax.inject.Named;
import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
//第一种方法
@Module
public class Dagger1ActivityModule {
    @Provides
    public Cloth getCloth() {
        Cloth cloth = new Cloth();
        cloth.setColor("红色");
        return cloth;
    }

    //参数会自动调用getCloth()
    //步骤1：查找Module中是否存在创建该类的方法。
    //步骤2：若存在创建类方法，查看该方法是否存在参数
    //步骤2.1：若存在参数，则按从步骤1开始依次初始化每个参数
    //步骤2.2：若不存在参数，则直接初始化该类实例，一次依赖注入到此结束
    //步骤3：若不存在创建类方法，则查找Inject注解的构造函数，看构造函数是否存在参数
    //步骤3.1：若存在参数，则从步骤1开始依次初始化每个参数
    //步骤3.2：若不存在参数，则直接初始化该类实例，一次依赖注入到此结束
    @Provides
    public Clothes getClothes(Cloth cloth){
        return new Clothes(cloth);
    }

    //Dagger2是通过返回值类型来确定的,当你需要红布料时,它又怎么知道哪个是红布料呢?
    // 所以Dagger2为我们提供@Named注解,它怎么使用呢?它有一个value值,用来标识这个方法是给谁用的
    @Provides
    @Named("red")
    public Cloth2 getRedCloth() {
        Cloth2 cloth = new Cloth2();
        cloth.setColor("红色");
        return cloth;
    }
    @Provides
    @Named("blue")
    public Cloth2 getBlueCloth() {
        Cloth2 cloth = new Cloth2();
        cloth.setColor("蓝色");
        return cloth;
    }

    @Provides
    @RedCloth
    public Cloth2 getRedCloth_q() {
        Cloth2 cloth = new Cloth2();
        cloth.setColor("红色-q");
        return cloth;
    }

    //会调用上面蓝色的布料
    @Provides
    public Clothes2 getClothes2(@Named("blue") Cloth2 cloth){
        return new Clothes2(cloth);
    }

    //注意注意注意:单例是在同一个Component实例提供依赖的前提下才有效的,
    // 不同的Component实例只能通过Component依赖才能实现单例.也就是说,
    // 你虽然在两个Component接口上都添加了PerActivity注解,
    // 但是这两个Component提供依赖时是没有联系的,他们只能在各自的范围内实现单例.
    @Singleton
    @Provides
    public Cloth3 getCloth3() {
        Cloth3 cloth = new Cloth3();
        cloth.setColor("红色");
        return cloth;
    }

    @ScopeDagger1
    @Provides
    public Cloth4 getCloth4() {
        Cloth4 cloth = new Cloth4();
        cloth.setColor("红色");
        return cloth;
    }


}
